#pragma once

namespace gtl
{

namespace type
{

class void_;

class null { };

template<int num>
struct int2ty {};

template<class Type>
struct ty2ty {};

template<class T>
struct ptr
{
	typedef T* type;

	static T* value(T& val)
	{
		return &val;
	}
};

template<class T>
struct ptr<T&>
{
	typedef T* type;

	static T* value(T& val)
	{
		return &val;
	}
};

template<class T>
struct ptr<const T&>
{
	typedef const T* type;

	static const T* value(const T& val)
	{
		return &val;
	}
};

template<class T>
struct ptr<T*>
{
	typedef T* type;

	static T* value(T* val)
	{
		return val;
	}
};

template<class T>
struct ptr<const T*>
{
	typedef const T* type;

	static const T* value(const T* val)
	{
		return val;
	}
};

} // end of namespace type

} // end of namespace gtl